package game;

import java.awt.Color;
/*
 * Rappresenta gli elementi non stazionari ( Mostri , Giocatore )
 */
public abstract class Attore {
	public Amministratore amministratore;
	
	public int x;
	public int y;
	
	private char glyph;
	public char glyph() { return glyph; }
	
	private Color color;
	/*
	 * Ogni attore ha un colore diverso
	 * @return il colore del attore oggetto
	 */
	public Color color() { return color; }
	
	
	/*
	 * il massimo dei punti vita di un attore
	 */
	private int maxHp;
	public int maxHp() { return maxHp; }
	/*
	 * i punti vita attuali dell'attore
	 */
	private int hp;
	public int hp() { return hp; }
	/*
	 * valore di attacco da aggiungere al danno dell'arma
	 */
	private int attack;
	public int attackValue() { 
		int temp;
		if((temp=arma.attacco())==0)
			return temp;
		else
			return temp+attack; 
	}
	
	private int defenseValue;

	private String name;
	public String name() { return name; }
	
	private Arma arma;
	

	public int defenseValue() { return defenseValue; }
	
	public Attore(Amministratore amministratore, char glyph, Color color,String name, int maxHp,int hp, int attack, int defense,Arma arma){
		this.amministratore = amministratore;
		this.glyph = glyph;
		this.color = color;
		this.maxHp = maxHp;
		if(hp==-1)
			this.hp = maxHp;
		else
			this.hp=hp;
		this.attack = attack;
		this.defenseValue = defense;
		this.name=name;
		this.arma=arma;
	}
	
	public boolean moveByPlayer(int mx, int my){
		Attore other = amministratore.attore(x+mx, y+my);
		Cella cella = amministratore.cella(x+mx, y+my);
		if(cella.isUscita())
			return true;
		if (other == null)
			 onEnter(x+mx, y+my, amministratore.cella(x+mx, y+my));
		else
			attack(other);
		return false;
	}
	public void onEnter(int x, int y, Cella cella){
		if (cella.isGround()){
			this.x = x;
			this.y = y;
		} 
	}

	public void moveBy(int mx, int my){
		Attore other = amministratore.attore(x+mx, y+my);
		if (other == null)
			onEnter(x+mx, y+my, amministratore.cella(x+mx, y+my));
		else
			attack(other);
	}
	/*
	 * Attacca un'altro attore
	 * @param other altro attore che subisce l'attacco
	 */
	public void attack(Attore other){
		int amount = Math.max(0, attackValue());
		if((amount-=defenseValue)<0)
			amount=0;
		
				
		other.modifyHp(-amount);
	}

	/*
	 * Modifica i punti vita dell'attore
	 * @param amount il danno che subisce
	 */
	public void modifyHp(int amount) { 
		hp += amount;
		
		if (hp < 1) {
			
			amministratore.remove(this);
		}
	}
	/*
	 * Usa una pozione che ripristina la vita se si ha subito danni
	 * @param x2:coordinata x della pozione
	 * @param y2:coordinata y della pozione
	 * @param value:valore dela pozione
	 */
	public void usePotion(int x2, int y2,int value) {
		if(maxHp>hp+value)
			hp+=value;
		else
			hp=maxHp;
		amministratore.removePotion(x2,y2);
	}
	
	public abstract void update();

	public boolean canEnter(int wx, int wy) {
		return amministratore.cella(wx, wy).isGround() && amministratore.attore(wx, wy) == null;
	}

	public Attore attore(int wx, int wy) {
		return amministratore.attore(wx, wy);
	}

	public void incAttack() {
		attack+=3;
	}

	@Override
	public String toString() {
		
		return name+","+x+","+y+","+maxHp+","+hp+","+attack+","+defenseValue+","+arma;
	}
	public void insegui(Attore player){
		int mx;
		int my;
		if(player.x>=this.x){
			if(player.x==this.x)
				mx=0;
			else
				mx=1;
		}
		else
			mx=-1;
		if(player.y>=this.y){
			if(player.y==this.y)
				my=0;
			else
				my=1;
		}
		else
			my=-1;
		Attore other = amministratore.attore(x+mx, y+my);
		
		if ((other != null && (other instanceof Orco || other instanceof Boss)))
			return;
		moveBy(mx, my);
	}
	
}
